import router from "@/router";
import { useUserStore } from "@/stores/user";
import axios, { type Method } from "axios";
import { ElMessage } from "element-plus";

const service = axios.create({
  baseURL: 'https://api-hmzs.itheima.net/tj',
  timeout: 1000,
})
// 请求拦截器
service.interceptors.request.use(
 ( config)=> {
    const {token} =useUserStore();
    if(token){
      config.headers.Authorization = `Bearer ${token}`
    }
    return config;
  },
  (error) => {
    return Promise.reject(error);
  },
)
// 响应拦截器
service.interceptors.response.use(
  (response) => {
    return response.data;
  },
  (error) => {
    // console.log(error);
    if(error.response){
      if(error.response.status===401){
        // 认证失败，可以在这里处理重新登录的逻辑
        const store = useUserStore();
        store.removeToken();
        // 跳转登录页
        router.push('/login');
        ElMessage.error("认证失败，请重新登录");
      }else if(error.response.status===400){
        ElMessage.error(error.response.data.msg);
      }else{
         // 未知错误，如果后端有提示信息就显示，否则显示未知错误
         ElMessage.error(error.response.data?.msg || "未知网络错误");
      }
      }else{
        if(error.message.includes('timeout')){
          ElMessage.error('网络请求超时');
        }else{
          ElMessage.error('未知网络错误');
        }
      }
    return Promise.reject(error);
  },
);

export interface ServiceResponse<T>{
  code:number;
  msg:string;
  data:T
}
  
// 请求工具函数
export const request = <T = unknown>(
  url: string,
  method: Method = "GET", // 默认请求方式 GET
  submitData?: object
) => {
  // 通过泛型约束返回值类型
  return service.request<T, ServiceResponse<T>>({
    url,
    method,
    // 根据请求方式，动态设置请求参数
    [method.toUpperCase() === "GET" ? "params" : "data"]: submitData,
  });
};

export default service;
